
#Setar wd pelo ambiente (este no script é para o notebook) 
setwd("~/R/tese")


rm(list = ls()) 

# para ler arquivos xls
library(readxl)
# para gravar arquivos xls (com limitações)
library(writexl) 

#######################################################3

#  soluções de emergência
# se rodar em outro ambiente: usar comando setwd
#  se der pau na leitura direta do xls, converter arquivos de 
#  entrada excel em csv e usar no estilo:
#                  modelo = read.csv("Polity V.csv", header = TRUE, sep = ";")


#################################################################
########################### funções pré-programadas
#################################################################

# nome.funcao <- function(parm.funcao)
  #                              lista.a.conferir é qualquer data_frame entrada com as duas primeiras colunas sendo 
  #                              o país (cod. inernet) e o ano  com 4 digitos
  #                              - a saída é uma planilha que apenas lista inconsistências encontradas
# {  #begin function
# comandos da funcao  
# return (resultado.funcao) 
  #  fim da função
#}  #endfunction



#  subtotais de até 5 colunas, estruturados pela primeira coluna

 calcula.subtotais <- function(parm.chave, parm.subtotal1, parm.subtotal2,
                       parm.subtotal3, parm.subtotal4, parm.subtotal5)
#                              parm.chave é um vetor com os dados da coluna pela qual vão ser gerados os subtotais
#                              parm.subtotais são vetores com os dados de até 5 colunas cujos valores serão somados
#                              - se algum parm.subtotal for NA, não é acumulado e a coluna correspondente volta com NA    
#                              - a saída é um dataframe com a primeira coluna com os valores não-repetidos da chave
   #                              e as demais cinco com os subtotais daquelas que foram fornecidas na entrada    
############        ==> esta função não sorta as colunas de entrada, o subtotal é gerado
#                      a partir da ordem em que é recebida a coluna de chave
   
   
   {  #begin function


   
#  primeiro registro

     
chave.anterior <- as.character(parm.chave [1])
subtotal1 <- as.numeric(parm.subtotal1 [1])
subtotal2 <- as.numeric(parm.subtotal2 [1])
subtotal3 <- as.numeric(parm.subtotal3 [1])
subtotal4 <- as.numeric(parm.subtotal4 [1])
subtotal5 <- as.numeric(parm.subtotal5 [1])

# controla a primeira gravacao
ind.primeira.gravacao <- 1
                   
for (k in 2:length(parm.chave))
{
#     não mudou a chave - apenas acumula subtotais diferentes de NA
     if (as.character(parm.chave [k]) == chave.anterior)
     {
       if (! is.na (parm.subtotal1 [k]) )
       { subtotal1 = subtotal1 + as.numeric(parm.subtotal1 [k])}
       if (! is.na (parm.subtotal2 [k]) )
       { subtotal2 = subtotal2 + as.numeric(parm.subtotal2 [k])}
       if (! is.na (parm.subtotal3 [k]) )
       { subtotal3 = subtotal3 + as.numeric(parm.subtotal3 [k])}
       if (! is.na (parm.subtotal4 [k]) )
       { subtotal4 = subtotal4 + as.numeric(parm.subtotal4 [k])}
       if (! is.na (parm.subtotal5 [k]) )
       { subtotal5 = subtotal5 + as.numeric(parm.subtotal5 [k])}
     }
    else
#     mudou a chave - carrega o registro no dataframe de saída,
#     reinicializa os acumuladores e o controle de chave anterior
    {
      
     if (ind.primeira.gravacao == 1)
     {
      saida.subtotais <- data.frame (CHAVE = parm.chave [1], SUBTL1 = subtotal1,
                                     SUBTL1 = subtotal2 ,SUBTL3 = subtotal3,
                                     SUBTL4 = subtotal4,SUBTL5 = subtotal5)
       ind.primeira.gravacao <- 0
     }
      else
      {
      novo.registro.saida <- c (parm.chave [k - 1], subtotal1,
                                subtotal2, subtotal3,
                                subtotal4, subtotal5)

      saida.subtotais <- rbind (saida.subtotais, novo.registro.saida)
      }
      
      chave.anterior <- as.character(parm.chave [k])
      subtotal1 <- as.numeric(parm.subtotal1 [k])
      subtotal2 <- as.numeric(parm.subtotal2 [k])
      subtotal3 <- as.numeric(parm.subtotal3 [k])
      subtotal4 <- as.numeric(parm.subtotal4 [k])
      subtotal5 <- as.numeric(parm.subtotal5 [k])
      
    }
}  # end for
#  último registro (saiu do loop)
#  se não mudou em relação ao valor da chave anterior, salva com
#  o valor dos acumuladores
if (as.character(parm.chave [k]) == chave.anterior)
{
  novo.registro.saida <- c (parm.chave [k - 1], subtotal1,
                            subtotal2, subtotal3,
                            subtotal4, subtotal5)
  saida.subtotais <- rbind (saida.subtotais, novo.registro.saida)
}
#  se  mudou em relação ao valor da chave anterior, salva primeiro 
#  o valor acumulado até o registro anterior, e em seguida outra linha com
#  o valor do próprio último registro

else
{
  novo.registro.saida <- c (parm.chave [k - 1], subtotal1,
                            subtotal2, subtotal3,
                            subtotal4, subtotal5)
  saida.subtotais <- rbind (saida.subtotais, novo.registro.saida)
  
  novo.registro.saida <- c (parm.chave [k], as.numeric(parm.subtotal1 [k]),
                            as.numeric(parm.subtotal2), as.numeric(parm.subtotal3),
                            as.numeric(parm.subtotal4), as.numeric(parm.subtotal5) )
  
  saida.subtotais <- rbind (saida.subtotais, novo.registro.saida)
}
 
return (saida.subtotais) 
#  fim da função
}  #endfunction



#################################################################
########################### procedimento principal
#################################################################

############ testar primeiro o arquivo de entrada com o 
############ scipt "Confere ordem dos registros" para 
############ eliminar registros fora da ordem de ano/país


gabinetes.e.parlamentos = read_excel("gabinetes.e.parlamentos.xls", col_names = TRUE)
# se for um csv
# parm.lista.a.conferir = read.csv("gabinetes.e.parlamentos.csv")

#inicializa variaveis do loop
primeiro.registro.saida.basica <- 1
pais.corrente <- as.character(gabinetes.e.parlamentos$CTRY [1])
ano.corrente <- as.numeric(gabinetes.e.parlamentos$YR [1])
percentual.lower.house <- 0
percentual.upper.house <- 0



for (k in 1:nrow(gabinetes.e.parlamentos))
{  # begin for
  # enquanto permanecer no mesmo país/ano, soma percentuais de lower e upper house ano a ano
  
  
  if (as.character(gabinetes.e.parlamentos$CTRY [k]) == pais.corrente)
  { 
 
    if (as.numeric(gabinetes.e.parlamentos$YR [k]) == ano.corrente)
       # acumula no mesmo ano/país, para os partidos que têm representação no gabinete
       {
      if ((gabinetes.e.parlamentos$CABINET_SHARE [k] > 0) &  (gabinetes.e.parlamentos$PARTY [k] != "no party"))
      {
        percentual.lower.house = percentual.lower.house + gabinetes.e.parlamentos$SEAT_SHARE_LOW_CHAMBER [k]
     
        if (! is.na (gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k]))
            {percentual.upper.house = percentual.upper.house + gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k] }
        else
            {percentual.upper.house = NA }    
      }
        }
    
    else
      # mudou o ano
    {
            # mudou o ano no mesmo pais: carrega os totais acumulados no pais/ano anterior
          if (primeiro.registro.saida.basica == 1)  # primeiro registro do data.frame de saida
           {
           
            # cria data-frame de saída com ano-pais, % da camara e % do senado
             saida.basica <- data.frame (CTR = gabinetes.e.parlamentos$CTRY [k-1],
                                         YR = gabinetes.e.parlamentos$YR [k-1], 
                                         PCT.LOW = percentual.lower.house, 
                                         PCT.HIGH =percentual.upper.house)

            primeiro.registro.saida.basica <- 0
            percentual.lower.house <- 0
            percentual.upper.house <- 0
            }
        else  # registros seguintes do dataframe de saida
         
            {
            novo.ano.pais <- c (gabinetes.e.parlamentos$CTRY [k-1], 
                                gabinetes.e.parlamentos$YR [k-1],
                                percentual.lower.house,
                                percentual.upper.house)
            saida.basica <- rbind (saida.basica, novo.ano.pais)
            # mudou o ano no mesmo pais: atualiza o valor de ano corrente
   
            }  
          
            # mudou o ano no mesmo pais: atualiza o valor de ano corrente
            ano.corrente <- gabinetes.e.parlamentos$YR [k]
            
            #  mudou o ano no mesmo pais: reinicia o valor acumulado para o ano corrente
          
            if ((gabinetes.e.parlamentos$CABINET_SHARE [k] > 0) &  (gabinetes.e.parlamentos$PARTY [k] != "no party"))
            {
            percentual.lower.house = gabinetes.e.parlamentos$SEAT_SHARE_LOW_CHAMBER [k]
            
            if (! is.na (gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k]))
            {percentual.upper.house = gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k] }
            else
            {percentual.upper.house = NA }    
            }
            else
            {
              percentual.lower.house = 0
            if (! is.na (gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k]))
            {percentual.upper.house = 0 }
            else
            {percentual.upper.house = NA }    
            }
      
              
        }
    
  }
  #  endif no mesmo pais
    else
    # # mudou o pais
    {
      # mudou o pais: carrega os totais acumulados no pais/ano anterior 
      #  (desnecessário prever o primeiro registro do dataframe de saída, porque o primeiro
      #   país sempre terá tido uma somatoria de alguns anos)
      novo.ano.pais <- c (gabinetes.e.parlamentos$CTRY [k-1], 
                          gabinetes.e.parlamentos$YR [k-1],
                          percentual.lower.house,
                          percentual.upper.house)
      saida.basica <- rbind (saida.basica, novo.ano.pais)
     
      # mudou o pais: atualiza o valor de ano e pais correntes
      pais.corrente <- gabinetes.e.parlamentos$CTRY [k]
      ano.corrente <- gabinetes.e.parlamentos$YR [k]
      
      # mudou  o pais: reinicia o valor acumulado para o novo ano/pais corrente
     
      if ((gabinetes.e.parlamentos$CABINET_SHARE [k] > 0) &  (gabinetes.e.parlamentos$PARTY [k] != "no party")) 
      {
          percentual.lower.house = gabinetes.e.parlamentos$SEAT_SHARE_LOW_CHAMBER [k]
      
          if (! is.na (gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k]))
          { percentual.upper.house = gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k] }
          else
            {percentual.upper.house = NA }
      }
      else
      {
           percentual.lower.house = 0
        
           if (! is.na (gabinetes.e.parlamentos$SEAT_SHARE_HIGH_CHAMBER [k]))
           {percentual.upper.house = 0 }
           else
           {percentual.upper.house = NA }
      }
        
      
  
       }  # end-else de mudança de país
      
  
}  #end for

#  último registro (saiu do loop)

novo.ano.pais <- c (gabinetes.e.parlamentos$CTRY [k], 
                    gabinetes.e.parlamentos$YR [k],
                    percentual.lower.house,
                    percentual.upper.house)
saida.basica <- rbind (saida.basica, novo.ano.pais)


# indicadores basicos
saida.basica$ind.minority.lower <- 0  # indicador de minoria na camara baixa (< 50%)
saida.basica$ind.minority.upper <- 0  # indicador de minoria na camara alta (< 50%)
 
saida.basica$ind.threshold45pct.lower <- 0  # indicador de limiar de 45 % da bancada 
#                                       na camara baixa (45% < threshold < 50%)
saida.basica$ind.threshold45pct.upper <- 0  # indicador de limiar de 45 % da bancada 
#                                       na camara alta (45% < threshold < 50%)
#                                       nas duas camaras  (45% < threshold < 50%)
saida.basica$ind.threshold40pct.lower <- 0  # indicador de limiar de 40 % da bancada 
#                                       na camara baixa (40% < threshold < 50%)
saida.basica$ind.threshold40pct.upper <- 0  # indicador de limiar de 45 % da bancada 
#                                       na camara alta (40% < threshold < 50%)

#indicadores compostos
saida.basica$ind.minority <- 0        #  indicador de minoria analítico (minoria 
#                                       unicameral ou de qualquer das camaras bicamerais
saida.basica$ind.minority.unicameral <- 0  #  indicador de minoria unicameral
saida.basica$ind.minority.only.lower <- 0  #  indicador de minoria apenas na câmara 
#                                             baixa em parlamentos bicamerais
saida.basica$ind.minority.only.upper <- 0  #  indicador de minoria apenas na câmara 
#                                             alta em parlamentos bicamerais
saida.basica$ind.minority.both <- 0  #  indicador de minoria em ambas as câmaras 
#                                             em parlamentos bicamerais

for (k in 1:nrow(saida.basica))
{
  if (saida.basica$PCT.LOW [k] < 0.5)
  {
    saida.basica$ind.minority.lower [k] <- 1
    
    if (saida.basica$PCT.LOW [k] > 0.4)
    {saida.basica$ind.threshold40pct.lower [k] <- 1 }
    
    if (saida.basica$PCT.LOW [k] > 0.45)
    {saida.basica$ind.threshold45pct.lower [k] <- 1 }
   }
 
  if (! is.na(saida.basica$PCT.HIGH [k]))
  {
#  trata casos bicamerais    
    if (saida.basica$PCT.HIGH [k] < 0.5)
    {
      {saida.basica$ind.minority.upper [k] <- 1}
      
       if (saida.basica$PCT.HIGH [k] > 0.4)
       {saida.basica$ind.threshold40pct.upper [k] <- 1 }
    
       if (saida.basica$PCT.HIGH [k] > 0.45)
       {saida.basica$ind.threshold45pct.upper [k] <- 1 }
    }
    }
    else 
    {
      saida.basica$ind.minority.upper [k] <- NA
      saida.basica$ind.threshold40pct.upper [k] <- NA
      saida.basica$ind.threshold45pct.upper [k] <- NA
    }
  
  if (is.na(saida.basica$ind.minority.upper [k]))
#    casos unicamerais    
  {
    if (saida.basica$ind.minority.lower [k] == 1)
        saida.basica$ind.minority.unicameral [k] <- 1
  }
  else
  {
  if (saida.basica$ind.minority.lower [k] == 1)
       {
         if (saida.basica$ind.minority.upper [k] == 1)
         {saida.basica$ind.minority.both [k] <- 1} 
         else
         {saida.basica$ind.minority.only.lower [k] <- 1}
       }
  else
     {
       if (saida.basica$ind.minority.upper [k] == 1)
          {saida.basica$ind.minority.only.upper [k] <- 1} 
     }
  }
# indicador de qualquer tipo de minoria (definição analítica)
if  ( (saida.basica$ind.minority.unicameral [k] == 1)  | 
      (saida.basica$ind.minority.only.lower [k] ==1) |
      (saida.basica$ind.minority.only.upper [k] ==1) |
      (saida.basica$ind.minority.both [k] ==1) )
{saida.basica$ind.minority [k] <- 1}
  
# indicadores equivalentes para minorias de 40 e 45 pct (definição analítica,
#    de percentagens entre 40/45 e 50 pct em ambas as câmaras)
#
#  casos unicamerais
  saida.basica$ind.threshold40pct [k] <- 0
  saida.basica$ind.threshold45pct [k] <- 0
  
  if  ( is.na (saida.basica$PCT.HIGH [k]) )
    { 
      if (saida.basica$ind.threshold40pct.lower [k] == 1)
      {saida.basica$ind.threshold40pct [k] <- 1}
      if (saida.basica$ind.threshold45pct.lower [k] == 1)
      {saida.basica$ind.threshold45pct [k] <- 1}
           
    }
  else
     #  casos bicamerais
    {
        if ( (saida.basica$ind.threshold40pct.lower [k] == 1) |
             (saida.basica$ind.threshold40pct.upper [k] == 1)  )
          {saida.basica$ind.threshold40pct [k] <- 1}

        if ( (saida.basica$ind.threshold45pct.lower [k] == 1) |
              (saida.basica$ind.threshold45pct.upper [k] == 1)  )
          {saida.basica$ind.threshold45pct [k] <- 1}
          
   }     
  
}# END FOR

#######################################################
#######################################################
#######################################################
#  tabelas de saída
# totais: geral / minoria só camara bicameral / minoria só senado bicameral / 
#              minoria ambos bicameral / minoria unicameral
# analítico: minorias (marcação de cada câmara)


relatorio.analitico <- saida.basica [saida.basica$ind.minority == 1,]
relatorio.analitico <- relatorio.analitico[c(1:6)]
relatorio.analitico$PCT.LOW <- as.numeric (relatorio.analitico$PCT.LOW)*100
relatorio.analitico$PCT.LOW <- format(relatorio.analitico$PCT.LOW, decimal.mark = ",", digits = 3)
relatorio.analitico$PCT.HIGH <- as.numeric (relatorio.analitico$PCT.HIGH)*100
relatorio.analitico$PCT.HIGH <- format(relatorio.analitico$PCT.HIGH, decimal.mark = ",", digits = 3)


total0 <- c ("Governments in country/years", NA)
total1 <- c ("Total number of governments", nrow(saida.basica))
total2 <- c ("Total number of minority governments", sum(saida.basica$ind.minority))
total3 <- c ("Total numer of minority situations only in the bicameral lower house", sum(saida.basica$ind.minority.only.lower))
total4 <- c ("Total number of minority situations only in the bicameral upper house", sum(saida.basica$ind.minority.only.upper))
total5 <- c ("Total number of minority situations in both bicameral houses", sum(saida.basica$ind.minority.both))
total6 <- c ("Total number of minority situations in unicameral parliaments", sum(saida.basica$ind.minority.unicameral))

# trata os legislative support thresholds 40 e 45%
total7 <- c ("Legislative support thresholds", NA)
total.over.40 <- sum(saida.basica$ind.threshold40pct.lower, na.rm = TRUE) + sum(saida.basica$ind.threshold40pct.upper, na.rm = TRUE)
total.over.45 <- sum(saida.basica$ind.threshold45pct.lower, na.rm = TRUE) + sum(saida.basica$ind.threshold45pct.upper, na.rm = TRUE)
total.between.40.45 <- total.over.40 - total.over.45
# soma das câmaras que têm minoria (tomadas individualmente) - o número de situações bicamerais precisa  
#  ser computado duas vezes, pois cada situação representa duas câmaras em minoria
total.minority.any.chamber <- as.numeric(total3[2]) + as.numeric(total4[2]) + as.numeric(total6[2]) + (2*as.numeric(total5[2])) 
pct.under.40 <- (total.minority.any.chamber - total.over.40) / total.minority.any.chamber * 100
pct.under.40 <- format(pct.under.40, decimal.mark = ",", digits = 3)
pct.between.40.45 <- total.between.40.45 / total.minority.any.chamber * 100
pct.between.40.45 <- format(pct.between.40.45, decimal.mark = ",", digits = 3)
pct.between.45.50 <- total.over.45 / total.minority.any.chamber * 100
pct.between.45.50 <- format(pct.between.45.50, decimal.mark = ",", digits = 3)


total8 <- c ("Total number of minority governments below 40% in any chamber", (total.minority.any.chamber - total.over.40)) 
total9 <- c (" as a share of minority governments in any chamber (%)", pct.under.40)
total10 <- c ("Total number of minority governments between 40% and 45% in any chamber", total.between.40.45)
total11 <- c (" as a share of minority governments in any chamber (%)", pct.between.40.45)
total12 <- c ("Total number of minority governments between 45% and 50% in any chamber", total.over.45)
total13 <- c (" as a share of minority governments in any chamber (%)", pct.between.45.50)


final.summary <- rbind (total0, total1, total2, total3, total4, total5, total6, 
                        total7, total8, total9, total10, total11, total12, total13 )
final.summary <- as.data.frame (final.summary)


#Subtotais por país (minoria/total)


saida.basica$num.total.governos <- 1
subtotais.pais <- calcula.subtotais (saida.basica$CTR, saida.basica$ind.minority,
                                     saida.basica$ind.threshold40pct, saida.basica$ind.threshold45pct,
                                     saida.basica$num.total.governos, NA)
subtotais.pais <- subtotais.pais [,1:5]

colnames(subtotais.pais) <- c('Country','Minority governments - absolute numbers',
                              'Minority above 40pct - absolute numbers', 'Minority above 45pct - absolute numbers',
                              'Total number of Governments')

subtotais.pais$percent.minority.govts <- as.numeric(subtotais.pais [,2]) / as.numeric(subtotais.pais [,5]) * 100
subtotais.pais$percent.minority.govts <- format(subtotais.pais$percent.minority.govts, decimal.mark = ",", digits = 3)

#Subtotais por ano / gráfico (número ansoluto)
#(empilhado 0-40%, 40-45%, 45-50%)

total.ordenado.por.ano <- saida.basica[order(saida.basica$YR),]

subtotais.ano <- calcula.subtotais (total.ordenado.por.ano$YR, total.ordenado.por.ano$ind.minority,
                                    total.ordenado.por.ano$ind.threshold40pct, total.ordenado.por.ano$ind.threshold45pct,
                                    total.ordenado.por.ano$num.total.governos, NA)
subtotais.ano <- subtotais.ano [,1:5]

colnames(subtotais.ano) <- c('Year','Minority governments - absolute numbers',
                              'Minority above 40pct - absolute numbers', 
                             'Minority above 45pct - absolute numbers',
                             'Total number of Governments')



#Function subtotal


# grava excel com todas as planilhas de saida
#  cada uma será uma planilha do arquivo final (planilha.saida é uma named list of dataframes)

planilha.saida <- list (Totais = final.summary, Detalhado = relatorio.analitico,
                        Subtotais_por_pais = subtotais.pais, 
                        Subtotais_por_ano = subtotais.ano)


write_xlsx(
  planilha.saida,
  path = "planilha.saida.governos.minoritarios.xlsx",
  col_names = TRUE,
  #  format_headers = TRUE,
  #  use_zip64 = FALSE
)
